package com.yifeng.repo.base.mdm.transport.biz;

import com.gomcarter.frameworks.base.common.AssertUtils;
import com.yifeng.repo.base.api.DateTimeRange;
import com.yifeng.repo.base.mdm.MasterDataManager;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;

/**
 * Created by daibing on 2024/2/7.
 */
public interface BizTransportAction<T> {

    /**
     * 数据传输工作线程名称
     *
     * @return 默认是数据传输数据模型类名
     */
    default String name() {
        Type genericInterface = this.getClass().getGenericInterfaces()[0];
        AssertUtils.notNull(genericInterface, "获取泛型接口错误！");
        Type actualTypeArgument = ((ParameterizedType) genericInterface).getActualTypeArguments()[0];
        AssertUtils.notNull(actualTypeArgument, "获取参数类型错误！");
        return ((Class<?>) actualTypeArgument).getSimpleName();
    }

    /**
     * 周期性任务拉取周期时间：默认一次拉取15分钟周期内的数据
     */
    default Integer fetchPeriodMinutes() {
        return 15;
    }

    /**
     * 一次性任务拉取时间区间：默认从2000年到今天0时0分1秒
     */
    default DateTimeRange fetchTimeRange() {
        return new DateTimeRange(
                LocalDateTime.of(2000, 1, 1, 1, 1, 1),
                LocalDateTime.of(LocalDate.now(), LocalTime.of(0, 0, 1)));
    }

    /**
     * 拉取主数据
     *
     * @param segmentKey        时间段key
     * @param dateTimeRange     时间区间
     * @param offsetMap         偏移量，支持多个偏移量（比如拉取人员的时间和人员工号）
     * @param masterDataManager 主数据管理
     * @return 拉取到的主数据对象列表
     */
    List<T> fetchData(String segmentKey, DateTimeRange dateTimeRange, Map<String, Object> offsetMap, MasterDataManager masterDataManager);

    /**
     * 投递业务处理
     *
     * @param segmentKey 时间段key
     * @param dataList   数据列表
     * @return offsetMap 偏移量，支持多个偏移量（比如拉取人员的时间和人员工号）
     */
    Map<String, Object> saveData(String segmentKey, List<T> dataList);

    /**
     * 拉取数据完成
     *
     * @param segmentKey    时间段key
     * @param dateTimeRange 时间区间
     * @param count         拉取总数
     */
    void finished(String segmentKey, DateTimeRange dateTimeRange, Integer count);

}
